<!DOCTYPE html>
<html lang="zh-CH" >
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="author" content="" />
	
	
	
	<title>设计模式之代理模式 ｜ zansimple</title>
	
    
    
    <meta name="description" content="前言 最近自己正在研究一套自己的 AssetBundle 框架。想到代理模式非常适合这个框架的开发，所以在此提前先简单介绍一下代理模式
什么是代理模式 定义：为其他对象提供一种代理以控制对这个对象的访问。在某些情况下，一个对象不适合或者不能直接引用另一个对象，而代理对象可以在客户端和目标对象之间起到中介的作用。
在代理模式（Proxy Pattern）中，一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中，我们创建具有现有对象的对象，以便向外界提供功能接口。
代理模式的组成 抽象角色：通过接口或抽象类声明真实角色实现的业务方法。
代理角色：实现抽象角色，是真实角色的代理，通过真实角色的业务逻辑方法来实现抽象方法，并可以附加自己的操作。
真实角色：实现抽象角色，定义真实角色所要实现的业务逻辑，供代理角色调用。
代理模式的优缺点 优点：  职责清晰 高扩展性 代理对象可以在客户端和目标对象之间起到中介的作用，这样起到了中介的作用和保护了目标对象的作用。  缺点：  由于在客户端和真实主题之间增加了代理对象，因此有些类型的代理模式可能会造成请求的处理速度变慢。 实现代理模式需要额外的工作，有些代理模式的实现非常复杂。  代理模式的实现 我们这里借用一下菜鸟教程的例子-菜鸟教程
例：创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类，减少 RealImage 对象加载的内存占用。 ProxyPatternDemo，我们的演示类使用 ProxyImage 来获取要加载的 Image 对象，并按照需求进行显示。
创建接口 public interface Image {void Display();} 创建实现接口的实体类 真实角色
public class RealImage : Image {private string fileName;public RealImage(string fileName){this.fileName = fileName;LoadFromDisk(fileName);}public void Display() {print(&amp;quot;Displaying &amp;quot; &#43; fileName);}private void LoadFromDisk(string fileName){print(&amp;quot;Loading &amp;quot; &#43; fileName);}} 代理角色" />
    

    

	
    
    <link rel="shortcut icon" href="https://lenzan.github.io/images/favicon.ico" />

    <link rel="stylesheet" type="text/css" media="screen" href="https://lenzan.github.io/css/normalize.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.jsdelivr.net/npm/animate.css@4.1.0/animate.min.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://lenzan.github.io/css/zozo.css" />
	<link rel="stylesheet" type="text/css" media="screen" href="https://cdn.jsdelivr.net/npm/remixicon@2.5.0/fonts/remixicon.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://lenzan.github.io/css/highlight.css" />

    
    
</head>

<body>
    <div class="main animate__animated animate__fadeInDown">
        <div class="nav_container animated fadeInDown">
    <div class="site_nav" id="site_nav">
        <ul>
            
            <li>
                <a href="/">首页</a>
            </li>
            
            <li>
                <a href="/">unity</a>
            </li>
            
            <li>
                <a href="/">归档</a>
            </li>
            
            <li>
                <a href="/">关于</a>
            </li>
            
        </ul>
    </div>
    <div class="menu_icon">
        <a id="menu_icon"><i class="ri-menu-line"></i></a>
    </div>
</div>
        <div class="header animated fadeInDown">
    <div class="site_title_container">
        <div class="site_title">
            <h1>
                <a href="https://lenzan.github.io/">
                    <span>zansimple</span>
                    <img src="https://lenzan.github.io/images/logo.svg" />
                </a>
            </h1>
        </div>
        <div class="description">
            <p class="sub_title">专注于Unity虚拟现实开发，游戏开发</p>
            <div class="my_socials">
                
                <a href="https://lenzan.github.io/index.xml" type="application/rss+xml" title="rss" target="_blank"><i
                        class="ri-rss-fill"></i></a>
            </div>
        </div>
    </div>
</div>
        <div class="content">
            <div class="post_page">
                <div class="post animate__animated animate__fadeInDown">
                    <div class="post_title post_detail_title">
                        <h2><a href='/posts/design/proxy-Pattern/'>设计模式之代理模式</a></h2>
                        <span class="date">2018.07.30</span>
                    </div>
                    <div class="post_content markdown"><h2 id="前言">前言</h2>
<p>最近自己正在研究一套自己的 AssetBundle 框架。想到代理模式非常适合这个框架的开发，所以在此提前先简单介绍一下代理模式</p>
<h2 id="什么是代理模式">什么是代理模式</h2>
<p>定义：为其他对象提供一种代理以控制对这个对象的访问。在某些情况下，一个对象不适合或者不能直接引用另一个对象，而代理对象可以在客户端和目标对象之间起到中介的作用。</p>
<p>在代理模式（Proxy Pattern）中，一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。</p>
<p>在代理模式中，我们创建具有现有对象的对象，以便向外界提供功能接口。</p>
<h2 id="代理模式的组成">代理模式的组成</h2>
<p>抽象角色：通过接口或抽象类声明真实角色实现的业务方法。</p>
<p>代理角色：实现抽象角色，是真实角色的代理，通过真实角色的业务逻辑方法来实现抽象方法，并可以附加自己的操作。</p>
<p>真实角色：实现抽象角色，定义真实角色所要实现的业务逻辑，供代理角色调用。</p>
<h2 id="代理模式的优缺点">代理模式的优缺点</h2>
<h3 id="优点">优点：</h3>
<ul>
<li>职责清晰</li>
<li>高扩展性</li>
<li>代理对象可以在客户端和目标对象之间起到中介的作用，这样起到了中介的作用和保护了目标对象的作用。</li>
</ul>
<h3 id="缺点">缺点：</h3>
<ul>
<li>由于在客户端和真实主题之间增加了代理对象，因此有些类型的代理模式可能会造成请求的处理速度变慢。</li>
<li>实现代理模式需要额外的工作，有些代理模式的实现非常复杂。</li>
</ul>
<h3 id="代理模式的实现">代理模式的实现</h3>
<p>我们这里借用一下菜鸟教程的例子-<a href="http://www.runoob.com/design-pattern/proxy-pattern.html">菜鸟教程</a></p>
<p>例：创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类，减少 RealImage 对象加载的内存占用。
ProxyPatternDemo，我们的演示类使用 ProxyImage 来获取要加载的 Image 对象，并按照需求进行显示。</p>
<p><img src="/img/pattern/proxy_pattern_uml.jpg" alt="UML类图"></p>
<h4 id="创建接口">创建接口</h4>
<pre><code>public interface Image {
    void Display();
}
</code></pre>
<h4 id="创建实现接口的实体类">创建实现接口的实体类</h4>
<p>真实角色</p>
<pre><code>public class RealImage : Image {

    private string fileName;
    
    public RealImage(string fileName){
        this.fileName = fileName;
        LoadFromDisk(fileName);
    }
    
    public void Display() {
        print(&quot;Displaying &quot; + fileName);
    }
    
    private void LoadFromDisk(string fileName){
        print(&quot;Loading &quot; + fileName);
    }
}
</code></pre>
<p>代理角色</p>
<pre><code>public class ProxyImage : Image{

    private RealImage realImage;
    private string fileName;
    
    public ProxyImage(string fileName){
        this.fileName = fileName;
    }
    
    public void Display() {
        if(realImage == null){
            realImage = new RealImage(fileName);
        }
        realImage.Display();
    }
}
</code></pre>
<h4 id="当被请求时使用-proxyimage-来获取-realimage-类的对象">当被请求时，使用 ProxyImage 来获取 RealImage 类的对象</h4>
<pre><code>public class ProxyPatternDemo {

    public static void main(string[] args) {
        Image image = new ProxyImage(&quot;test_10mb.jpg&quot;);
    
        //图像将从磁盘加载
        image.Display(); 
        print(&quot;&quot;);
        //图像将无法从磁盘加载
        image.Display();  
    }
}</code></pre>
</div>
                    <div class="post_footer">
                        
                        <div class="meta">
                            <div class="info">
                                <span class="field tags">
                                    <i class="ri-stack-line"></i>
                                    
                                    <a href="https://lenzan.github.io/tags/%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F/">代理模式</a>
                                    
                                    <a href="https://lenzan.github.io/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">设计模式</a>
                                    
                                </span>
                            </div>
                        </div>
                        
                    </div>
                </div>
                
                
            </div>
        </div>
    </div>
    <a id="back_to_top" href="#" class="back_to_top"><span>△</span></a>
    <footer class="footer">
    <div class="powered_by">
        <a href="https://varkai.com">Designed by VarKai,</a>
        <a href="http://www.gohugo.io/">Proudly published with Hugo</a>
    </div>

    <div class="footer_slogan">
        <span></span>
    </div>
</footer>
    <script src="https://lenzan.github.io/js/jquery-3.5.1.min.js"></script>
<link href="https://lenzan.github.io/css/fancybox.min.css" rel="stylesheet">
<script src="https://lenzan.github.io/js/fancybox.min.js"></script>
<script src="https://lenzan.github.io/js/zozo.js"></script>






</body>

</html>